#include "include.h"

#if MUSIC_LRC_EN

u8 lrc_buf[512] AT(.buf.lrc);
char lrc_lfn[100] AT(.lrc_buf);
extern char fname_buf[100];
void charcode_to_unicode(unsigned char *s, size_t n);
int lrc_is_encrypt(u16 key);

//u8 cfg_fs_get_filename_case(void)   //0小写，1大写，2 原样
//{
//    return 0;
//}
//
//AT(.text.lrc_cfg)
//u16 cfg_lrc_get_data_max_len(void)  //fname_buf加大时,可以加大lrc分析数据的长度
//{
//    return 97;
//}

AT(.text.lrc.init)
void bsp_lrc_init(void)
{
    f_msc.lrc_sta = 0;
    if (!(f_msc.fname[99] & FB_GOT_FLN)) {
        fs_get_filename(f_msc.fname, sizeof(fname_buf));        //获取长文件名
        f_msc.fname[99] |= FB_GOT_FLN;
    }
    memcpy(lrc_lfn, f_msc.fname, sizeof(fname_buf));
    if (fs_open_lrc(lrc_lfn) == FR_OK) {
#if LRC_ENCRYPT_EN
        if (!lrc_is_encrypt(MUSIC_ENCRYPT_KEY)) {
            f_msc.lrc_encrypt = 1;
        } else {
            f_msc.lrc_encrypt = 0;
            fs_lseek_lrc(0,SEEK_SET);
        }
#endif // LRC_ENCRYPT_EN
        f_msc.lrc_sta = 1;
        f_msc.lrc_encoding = lrc_init(lrc_buf);
        if (f_msc.lrc_sta == LRC_FNAME_DISP_SECS) {
            f_msc.lrc_update = music_get_lrc(fname_buf, lrc_cur_lable_time());
            if (f_msc.lrc_update) {
        #if GUI_LCD_EN
                #if UNICODE_BIG5_EN
                    charcode_to_unicode((unsigned char *)fname_buf,48);
                #else
                    if (f_msc.lrc_encoding != LRC_GBK) {
                        utf16_convert_to_gbk(fname_buf, 48);
                        fname_buf[99] |= FB_GBK;
                    }
                #endif // UNICODE_BIG5_EN
        #endif // GUI_LCD_EN
            }
        }
        printf("got lrc file: %d, %d\n", f_msc.lrc_sta, f_msc.lrc_encoding);
    }
}

AT(.text.lrc)
void bsp_lrc_get_content(void)
{
    u32 mtime;
    if (f_msc.lrc_sta == LRC_FNAME_DISP_SECS) {
        mtime = music_get_cur_time() + 3;
        if (music_get_lrc(fname_buf, mtime)) {
            f_msc.lrc_update = 1;
    #if GUI_LCD_EN
           #if UNICODE_BIG5_EN
                    charcode_to_unicode((unsigned char *)fname_buf,48);
                #else
                    if (f_msc.lrc_encoding != LRC_GBK) {
                        utf16_convert_to_gbk(fname_buf, 48);
                        fname_buf[99] |= FB_GBK;
                    }
                #endif // UNICODE_BIG5_EN
    #endif // GUI_LCD_EN
            printf("[%02d:%02d.%d] %s\n", mtime/600, (mtime%600)/10, mtime%10, fname_buf);
        }
    }
}

AT(.text.lrc)
void bsp_lrc_sta_process(void)
{
    if (f_msc.lrc_sta && (f_msc.lrc_sta != LRC_FNAME_DISP_SECS)) {
        f_msc.lrc_sta++;
        if (f_msc.lrc_sta == LRC_FNAME_DISP_SECS) {
            if (lrc_first_lable_time() <= music_get_cur_time()) {
                f_msc.lrc_update = music_get_lrc(fname_buf, lrc_first_lable_time());
                if (f_msc.lrc_update) {
            #if GUI_LCD_EN
                #if UNICODE_BIG5_EN
                    charcode_to_unicode((unsigned char *)fname_buf,48);
                #else
                    if (f_msc.lrc_encoding != LRC_GBK) {
                        utf16_convert_to_gbk(fname_buf, 48);
                        fname_buf[99] |= FB_GBK;
                    }
                #endif // UNICODE_BIG5_EN
            #endif // GUI_LCD_EN

                }
            } else {
                f_msc.lrc_sta = LRC_FNAME_DISP_SECS - 1;
            }
        }
    }
}

AT(.text.lrc)
bool bsp_lrc_is_ready(void)
{
    if (f_msc.lrc_sta == LRC_FNAME_DISP_SECS) {
        return true;
    }
    return false;
}

#endif // MUSIC_LRC_EN
